/*                          UX-Framework                               
 *                                                                 
 *  iZE Co.,Ltd. Copyright 2009 All rights reserved.          
 *  This file is distributed under the terms of the GNU Lesser 
 *  General Public License, described in file LICENSE.                                     
 */

package jp.ize.ux.states;

// {{{ imports
import jp.ize.ux.UXObject;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.KeyboardEvent;
import flash.events.FocusEvent;
// }}}
// {{{ class UXBasicState
/**
 * UXBasicState クラス<br>
 * 幾つかの基礎的な状態クラスです。状態の基礎的なものを保持します。<br>
 *
 * @author		iZE Co., Ltd.<br>
 * @version		$Id$<br>
 */
class UXBasicState
{
	// {{{ public var target : UXObject
	/**
	 * ターゲットコンポーネントです。
	 */
	public var target(default, default) : UXObject;
	// }}}
	// {{{ public var enabled : Bool
	/**
	 * 有効状態かどうかを示します。
	 */
	public var enabled(default, default) : Bool;
	// }}}
	// {{{ public var focused : Bool
	/**
	 * フォーカス状態かどうかを示します。
	 */
	public var focused(default, default) : Bool;
	// }}}
	// {{{ public var highlighted : Bool
	/**
	 * ハイライト状態かどうかを示します。
	 */
	public var highlighted(default, default) : Bool;
	// }}}
	// {{{ public var selected : Bool
	/**
	 * 選択状態かどうかを示します。
	 */
	public var selected(default, default) : Bool;
	// }}}
	// {{{ public var eventTarget(default, default) : Dynamic;
	/**
	 * イベント発生時のターゲットコンポーネントです。
	 */
	public var eventTarget(default, default) : Dynamic;
	// }}}
	// {{{ public var subject(default, default) : Dynamic;
	/**
	 * イベントに対するオブザーバーパターンの主体です。
	 * 通常リスナー関数とnotify()メソッドを持つオブジェクトとなります。
	 */
	public var subject(default, default) : Dynamic;
	// }}}
	// {{{ public var mouse(default, default) : MouseEvent
	/**
	 * Actが参照する為に保存しておくマウスイベントを示します。
	 */
	public var mouse(default, default) : MouseEvent;
	// }}}
	// {{{ public var keyboard(default, default) : KeyboardEvent
	/**
	 * Actが参照する為に保存しておくキーボードイベントを示します。
	 */
	public var keyboard(default, default) : KeyboardEvent;
	// }}}
	// {{{ public var focus(default, default) : FocusEvent
	/**
	 * Actが参照する為に保存しておくフォーカスイベントを示します。
	 */
	public var focus(default, default) : FocusEvent;
	// }}}
	// {{{ public var any(default, default) : Dynamic
	/**
	 * Actが参照する為に保存しておくその他のパラメータを示します。
	 */
	public var any(default, default) : Dynamic;
	// }}}
	// {{{ private var ref : Int
	/**
	 * この状態を参照しているアクションの数で、参照カウンタです。
	 */
	private var ref : Int;
	// }}}
	// {{{ public function new()
	/**
	 * コンストラクタです。
	 */
	public function new()
	{
		enabled = true;
		focused = false;
		highlighted = false;
		selected = false;
	}
	// }}}
	// {{{ public function touch() : Void
	/**
	 * この状態を参照する時に、最初にこの関数を呼び出して参照カウンタを増やします。
	 */
	public function touch() : Void
	{
		ref++;
	}
	// }}}
	// {{{ public function detouch() : Void
	/**
	 * この状態の参照が終了する時に、この関数を呼び出して参照カウンタを減らします。
	 */
	public function detouch() : Void
	{
		ref--;
	}
	// }}}
}
// }}}
// {{{ class UXListStateIterator
/**
 * UXListStateIteratorクラス<br>
 */
class UXListStateIterator
{
	// {{{ properties

	var _state : UXListState;

	// }}}
	// {{{ public function new( state : UXListState )
	/**
	 * コンストラクタです。
	 */
	public function new( state : UXListState )
	{
		_state = state;
	}
	// }}}
	// {{{ public function hasNext() : Bool
	/**
	 * 次の要素があればtrue, なければfalseを返す関数です。
	 */
	public function hasNext() : Bool
	{
		return false;
	}
	// }}}
	// {{{ public function next() : T
	/**
	 * 次の要素を返す関数です。
	 */
	public function next() : UXObject
	{
		return null;
	}
	// }}}
}
// }}}
// {{{ class UXListState extends UXBasicState
/**
 * UXListState クラス<br>
 * 一次元の状態を表します。
 */
class UXListState extends UXBasicState
{
	// {{{ public var children(default, default) : Array<UXObject>
	/**
	 * 子コンポーネントの配列です。
	 */
	public var children(default, default) : Array<UXObject>;
	// }}}
	// {{{ public var cyclic(default, default) : Bool
	/**
	 * 子コンポーネント列の先頭と末尾がつながっているかどうかを示します。
	 * デフォルト値はfalseです。
	 */
	public var cyclic(default, default) : Bool;
	// }}}
	// {{{ public function new()
	/**
	 * コンストラクタです。
	 */
	public function new()
	{
		super();
		children = new Array();
	}
	// }}}
	// {{{ public function copy() : UXListState
	/**
	 * コピーコンストラクタです。
	 */
	public function copy() : UXListState
	{
		//暫定的
		return new UXListState();
	}
	// }}}
	// {{{ public function iterator() : Iterator<UXObject>
	/**
	 * 一次元の子要素を列挙するイテレーターを返す関数です。 cyclicモードの場合は、現在の先頭位置から最後の要素までを列挙した後、先頭要素から現在の先頭位置の一つ手前までの要素を順番に返します。
	 */
	public function iterator() : Iterator<UXObject>
	{
		return new UXListStateIterator( this.copy() );
	}

	// }}}
	// {{{ public function addListener( type : String, l : Dynamic ) : Void
	/**
	 * 子コンポーネントに指定のイベントが発生したらイベントリスナーを起動するように登録します。
	 */
 	public function addListener( type : String, l : Dynamic ) : Void
	{
		
	}
	// }}}
	// {{{ public function removeLisntener( type : String ) : Void
	/**
	 * 指定のイベントのイベントリスナーを全て削除します。
	 */
	public function removeLisntener( type : String ) : Void
	{
	}
	// }}}
}
// }}}
